#include "ConexionServer.h"
#include "../../SDLtoolkit/Asteroide.h"
#include "../DTOCliente.h"
#include "../DTOFinHandshake.h"


ConexionServer::ConexionServer(SocketProtocoloPlano* socket,SpaceBattleInterface* game,int listenPort,int broadcastPort,ColaMensajes* colaMensajesServer,const bool* conexionActiva) {
	this->colaMensajesServer = colaMensajesServer;
	this->enviarACliente = new ColaMensajes(SERVER_OWN);

	this->handshake(socket,game,listenPort,broadcastPort,colaMensajesServer,enviarACliente,conexionActiva);
}

void ConexionServer::handshake(SocketProtocoloPlano* socket,SpaceBattleInterface* game,int listenPort,int broadcastPort,ColaMensajes* enviar,ColaMensajes* recibir,const bool* conexionActiva){
	ColaMensajes* mensajesHandshake = new ColaMensajes(SERVER_OWN);
	ConexionBidireccional* conexion = new ConexionBidireccional("localhost",socket,mensajesHandshake,conexionActiva);

	std::list<Asteroide*> elements = game->getAsteroides();

	std::list<Asteroide*>::iterator it;
	for (it = elements.begin(); it != elements.end(); ++it) {
		conexion->enviar(((Asteroide*)*it)->getDTO());
	}


	//Cruzo los puertos, la conexion es crusada
	conexion->enviar(new DTOFinHandshake(broadcastPort,listenPort));

	DTOCliente* cliente= (DTOCliente*)conexion->recibir();
	this->cliente = cliente->getOwner();

	//Devuelvo el cliente como ultima instancia del handshake
	conexion->enviar(cliente);

	//Cambio los puertos de mis recever y sender para iniciar la comunicacion

	this->conexionACliente = new ConexionBidireccional(socket,listenPort,broadcastPort,colaMensajesServer,enviarACliente,conexionActiva);

	//Lo agrego a la cola de mensajes del server, Un nuevo cliente se conecto
	colaMensajesServer->setMensaje(cliente);

}

void ConexionServer::addToSend(DTO* dto){
	this->enviarACliente->setMensajeValidated(dto);
}

std::string ConexionServer::getCliente(){
	return cliente;
}

void ConexionServer::terminar(){
	this->conexionACliente->terminar();
	this->conexionACliente->join();
}

ConexionServer::~ConexionServer(){
	delete conexionACliente;
	delete enviarACliente;
}

